import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import Icons from "unplugin-icons/vite";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import vueJsx from "@vitejs/plugin-vue-jsx";
import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
import { visualizer } from 'rollup-plugin-visualizer';

const pathSrc = resolve(__dirname, "src");
// 获取环境变量
const isProduction = process.env.VITE_USER_NODE_ENV === 'production';
const isAnalyze = process.env.VITE_USER_NODE_ENV === 'production';
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue({
      // 仅在开发环境启用 reactivityTransform
      reactivityTransform: !isProduction
    }),
    vueJsx(),
    Icons({
      autoInstall: true,
      compiler: 'jsx'
    }),
    createSvgIconsPlugin({
      iconDirs: [resolve(pathSrc, "assets/icon")],
      symbolId: "icon-[dir]-[name]",
    }),
    AutoImport({
      imports: ["vue"],
      resolvers: [
        ElementPlusResolver()
      ],
      dts: resolve(pathSrc, 'auto-imports.d.ts'),
    }),
    Components({
      resolvers: [
        ElementPlusResolver({
          // 导入样式
          importStyle: true
        }),
      ],
      dirs: ["src/components"],
      dts: resolve(pathSrc, 'components.d.ts'),
    }),
    // 仅在分析模式启用包分析工具
    isAnalyze && visualizer({
      filename: 'dist/analysis.html',
      open: false,
      gzipSize: true,
      brotliSize: true,
    })
  ].filter(Boolean),
  resolve: {
    alias: {
      '@': pathSrc,
      '~': '/node_modules/'
    },
    extensions: ['.vue', '.js', '.jsx', '.ts', '.tsx'],
    dedupe: ['vue']
  },
  server: {
    hmr: {
      overlay: true, // 启用错误覆盖，便于开发调试
    },
    proxy: {
      '/api': {
        target: 'http://127.0.0.1:8000/',
        changeOrigin: true,
        ws: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    },
    // 开启预构建
    preTransformRequests: true,
    // 优化文件监听
    watch: {
      usePolling: false,
    }
  },
  // CSS 相关配置
  css: {
    // 开发环境启用 sourcemap
    devSourcemap: !isProduction,
    // 处理 Element Plus 的 :deep() 语法
    preprocessorOptions: {
      scss: {
        // 确保正确处理 scss 嵌套语法
      }
    }
  },
  build: {
    // 使用 esbuild 作为压缩工具
    minify: 'esbuild',
    // 优化 esbuild 配置
    esbuild: {
        // 在所有环境下移除 console.log 和 debugger
        pure: ['console.log', 'debugger'],
        // 更兼容的目标
        target: 'es2018'
      },
    // Rollup 配置
    rollupOptions: {
      output: {
        // 优化代码分割
        manualChunksStrategy: 'default',
        // 优化 chunk 命名，使用内容哈希确保缓存控制
        chunkFileNames: 'assets/js/[name]-[hash:8].js',
        entryFileNames: 'assets/js/[name]-[hash:8].js',
        assetFileNames: 'assets/[ext]/[name]-[hash:8][extname]',
        // 优化输出格式
        format: 'es',
        // 确保静态资源路径正确
        publicPath: '/',
        // 启用预加载以加速资源加载
        manualChunks: (id) => {
          // 将大型第三方库单独拆分
          if (id.includes('tinymce')) {
            return 'tinymce';
          }
          if (id.includes('monaco-editor')) {
            return 'monaco-editor';
          }
        }
      },
      // 启用 tree-shaking 减小包体积
      treeshake: true
    },
    // 生产环境禁用 CSS 代码分割，合并为单个 CSS 文件减少请求数
    cssCodeSplit: !isProduction,
    // 生产环境禁用 sourcemap 以减小包体积
    sourcemap: !isProduction,
    // 增大 chunk 大小警告限制
    chunkSizeWarningLimit: 2000,
    // 禁用压缩报告以提高构建速度
    reportCompressedSize: false,
    // 更兼容的构建目标
    target: 'es2018'
  },
  // 优化依赖预构建
  optimizeDeps: {
    include: [
      'vue',
      'element-plus',
      'axios',
      '@element-plus/icons-vue',
      'vue-router',
      'vuex'
    ],
    // 避免重复预构建
    force: false,
  },
  // 缓存配置
  cacheDir: 'node_modules/.vite',
  // 性能提示配置
  performance: {
    hints: isProduction ? 'warning' : false
  },
  // 静态资源处理
  assetsInclude: ['**/*.png', '**/*.jpg', '**/*.gif', '**/*.svg', '**/*.woff', '**/*.woff2', '**/*.ttf'],
  // 额外的插件配置
  // 在前面plugins数组中已定义所有插件
})